在分布式系統中查找故障超出了標準應用程序測試的能力。公司需要更智能的方法來持續測試微服務。一種越來越受歡迎的策略是混沌工程。使用這種主動測試實踐,組織可以在故障導致代價高昂的停機之前尋找并修復故障。繼續閱讀以了解混沌工程如何提高大型分布式系統的可靠性。
什么是混沌工程?定義
混沌工程是一種發現分布式系統漏洞的策略。這種做法需要在生產過程中將故障和錯誤注入軟件。一旦你故意造成錯誤,監控效果以查看系統如何響應壓力。通過故意“破壞”,您會發現可能影響組件和最終用戶的新問題。在導致數據丟失或服務影響之前解決已識別的弱點。
混沌工程允許管理員:
- 識別系統中的弱點。
- 實時查看系統如何響應壓力。
- 讓團隊為真正的失敗做好準備。
- 識別尚未導致系統范圍問題的錯誤。
Netflix 是第一個引入混沌工程的組織。2010 年,該公司發布了一款名為Chaos Monkey的工具。使用此工具,管理員能夠以隨機間隔在隨機位置造成故障。這種測試方法使 Netflix 的分布式基于云的系統對故障更具彈性。
誰使用混沌工程?
許多科技公司采用混沌工程來提高分布式系統的彈性。Netflix 繼續開創這種做法,但 Facebook、谷歌、微軟和亞馬遜等公司也有類似的測試模型。更多的傳統組織也開始使用混沌測試。例如,澳大利亞國民銀行應用混亂隨機關閉服務器并建立系統彈性。
混沌工程的需要
Sun Microsystem 的 Peter Deutsch 和他的同事列出了程序員通常對分布式系統做出的八個錯誤假設:
- 網絡可靠。
- 延遲為零。
- 帶寬是無限的。
- 網絡是安全的。
- 拓撲永遠不會改變。
- 有一個管理員。
- 運輸成本為零。
- 網絡是同質的。
這些謬誤顯示了在微服務架構中設計的分布式應用程序的動態性。這種系統有很多活動部件,管理員對云基礎設施幾乎沒有控制權。對設置的不斷更改會導致意外的系統行為。無法預測這些行為,但我們可以通過混沌工程重現和測試它們。
混沌工程與故障測試之間的區別
失敗測試檢查單個條件并確定屬性是真還是假。這樣的測試以先入為主的方式破壞了系統。結果通常是二進制的,它們不會發現有關應用程序的新信息。混沌測試的目標是生成關于系統的新知識。更廣泛的范圍和不可預測的結果使您能夠了解系統的行為、屬性和性能。您開辟了新的探索途徑,并了解如何改進系統。
雖然不同,但混亂和故障測試確實在關注點和使用的工具上有一些重疊。當您使用這兩個學科來測試應用程序時,您會獲得最佳結果。
混沌工程是如何工作的
混沌工程中的所有測試都是通過所謂的混沌實驗進行的。每個實驗都從將特定故障注入系統開始,例如延遲、CPU 故障或網絡黑洞。然后,管理員觀察并比較他們認為會發生的事情與實際發生的事情。一個實驗通常涉及兩組工程師。第一組控制故障注入,第二組處理效果。
以下是混沌實驗的分步流程:
第 1 步:創建假設
工程師分析系統并選擇導致什么故障。混沌工程的核心步驟是預測系統遇到特定錯誤后的行為方式。
工程師還需要在開始測試之前確定關鍵指標閾值。指標通常分為兩組:
- 關鍵指標:這些是實驗的主要指標。例如,您可以衡量對延遲、每秒請求數或系統資源的影響。
- 客戶指標:這些是預防性指標,可以告訴您測試是否太過分。客戶指標的示例是每分鐘訂單數或每秒流啟動數。如果測試開始影響客戶指標,這表明管理員停止試驗。
在某些測試中,這兩個指標可能重疊。
第 2 步:故障注入
工程師將特定故障添加到系統中。由于無法確定應用程序的行為方式,因此始終有一個備份計劃。大多數混沌工程工具都有反向選項。這樣,如果出現問題,您可以安全地中止測試并返回應用程序的穩定狀態。
第 3 步:衡量影響
當錯誤導致重大問題時,工程師會監控系統。關鍵指標是主要關注點,但始終監控整個系統。如果測試開始模擬中斷,團隊會尋找修復它的最佳方法。
第 4 步:驗證(或反駁)你的假設
成功的混沌測試有兩種結果之一。您要么驗證系統的彈性,要么找到需要修復的問題。兩者都是很好的結果。
混沌工程原理
雖然名稱可能暗示其他情況,但混沌工程中沒有任何隨機性。
這種測試方法遵循嚴格的原則,包括以下原則:
了解系統的正常狀態
定義系統的穩態。系統的通常行為是任何混沌實驗的參考點。通過了解系統何時處于健康狀態,您將更好地了解錯誤和故障的影響。
注入現實的錯誤和失敗
所有實驗都應反映現實和可能的情況。當您注入現實生活中的故障時,您會很好地了解哪些流程和技術需要升級。
生產測試
如果將測試應用于生產環境,您只能看到中斷對系統的影響。如果您的團隊幾乎沒有混沌測試經驗,讓他們開始在開發環境中進行試驗。準備好后測試生產環境。
控制爆炸半徑
始終最小化混沌測試的爆炸半徑。由于這些測試發生在生產環境中,因此測試可能會影響最終用戶。另一個標準預防措施是讓團隊為實際事件響應做好準備,以防萬一。
連續混沌
您可以將混沌實驗自動化到與 CI/CD 管道相同的級別。持續的混亂使您的團隊能夠不斷改進當前和未來的系統。
混沌工程的好處
混沌工程的好處跨越多個業務領域:
商業利益
混沌工程通過防止長時間的中斷來幫助阻止巨大的收入損失。這種做法還允許公司在不損失服務可靠性的情況下快速擴展。
技術優勢
來自混沌實驗的見解可以減少事故,但這并不是技術優勢的終點。團隊對系統模式和依賴關系有了更深入的了解,從而使他們能夠構建更強大的系統設計。混沌測試對于工程團隊來說也是極好的隨叫隨到的培訓。
客戶利益
更少的中斷意味著對最終用戶的干擾更少。改進的服務可用性和持久性是混沌工程的兩個主要客戶優勢。
混沌工程工具
這些是最常見的混沌工程工具:
- Chaos Monkey:這是 Netflix 創建的原始工具。雖然它于 2010 年問世,但 Chaos Monkey 仍然會定期更新,并且是首選的混沌測試工具。
- Gremlin:?Gremlin 幫助客戶設置和控制混沌測試。該工具的免費版本提供基本測試,例如關閉機器和模擬高 CPU 負載。
- Chaos Toolkit:這個開源計劃通過開放 API 和標準 JSON 格式使測試更容易。
- Pumba:?Pumba 是 Docker 的混沌測試和網絡仿真工具。
- Litmus:用于 Kubernetes 上的有狀態工作負載的混沌工程工具。
為了跟上新工具??的步伐,請為 Chaos Engineering Slack 社區創建的圖表添加書簽。除了工具之外,該圖表還記錄了從事混沌測試的已知工程師。
混沌工程示例
混沌實驗沒有限制。您運行的測試類型取決于您的分布式系統的架構和業務目標。
以下是最常見的混沌測試列表:
- 模擬微型組件的故障。
- 關閉虛擬機以查看依賴項如何反應。
- 模擬高 CPU 負載。
- 斷開系統與數據中心的連接。
- 在服務之間注入延遲。
- 隨機導致函數拋出異常(也稱為基于函數的混亂)。
- 向程序添加指令并允許故障注入(也稱為代碼插入)。
- 破壞系統時鐘之間的同步。
- 模擬 I/O 錯誤。
- 導致流量突然激增。
- 注入拜占庭式故障。
混沌工程和 DevOps
混沌工程是DevOps 文化中的一種常見做法。這樣的測試使 DevOps 能夠徹底分析應用程序,同時跟上敏捷開發的節奏。DevOps 團隊通常使用混沌測試來定義基礎設施的功能基線和容差。測試還通過闡明穩態和混沌輸出來幫助創建更好的政策和流程。一些公司更喜歡將混沌工程集成到他們的軟件開發生命周期中。集成混亂使公司能夠確保每個新功能的可靠性。
任何大型分布式系統的必備工具
對軟件的持續檢查對于應用程序的安全性和功能性都至關重要。通過主動檢查系統,您可以減輕運營負擔、提高系統可用性和彈性。